package test;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;


class PaymentStateMachine {
    // 当前支付状态
    private String currentState;
    // 状态转换图，存储状态及其可能的转换
    private Map<String, Map<String, String>> transitions;

    public PaymentStateMachine() {
        transitions = new HashMap<>();
    }

    // 添加状态
    public void addState(String stateName) {
        transitions.put(stateName, new HashMap<>());
    }

    // 添加状态转换
    public void addTransition(String fromState, String toState, String action) {
        // 检查状态是否存在
        if (transitions.containsKey(fromState) && transitions.containsKey(toState)) {
            // 添加转换
            transitions.get(fromState).put(action, toState);
        }
    }

    // 设置初始状态
    public void setInitialState(String stateName) {
        if (transitions.containsKey(stateName)) {
            currentState = stateName; // 设置当前状态
        }
    }

    // 根据输入的动作触发状态转换
    public void trigger(String action) {
        if (currentState != null) {
            Map<String, String> stateTransitions = transitions.get(currentState);
            String nextState = stateTransitions.get(action);
            if (nextState != null) {
                // 打印状态转换信息
                System.out.println("从 " + currentState + " 转换到 " + nextState + "，动作为 '" + action + "'");
                currentState = nextState; // 更新当前状态
            } else {
                // 如果没有有效的转换
                System.out.println("在状态 " + currentState + " 中，动作 '" + action + "' 没有有效的转换");
            }
        } else {
            System.out.println("状态机未初始化."); // 检查状态机是否已初始化
        }
    }

    // 获取当前状态
    public String getCurrentState() {
        return currentState;
    }

    public static void main(String[] args) {
        PaymentStateMachine sm = new PaymentStateMachine();

        // 添加状态
        sm.addState("待支付");
        sm.addState("已支付");
        sm.addState("已退款");
        sm.addState("已取消");

        // 添加状态转换
        sm.addTransition("待支付", "已支付", "支付");
        sm.addTransition("已支付", "已退款", "退款");
        sm.addTransition("已支付", "已取消", "取消");
        sm.addTransition("已退款", "已取消", "取消");

        // 设置初始状态为 "待支付"
        sm.setInitialState("待支付");

        Scanner scanner = new Scanner(System.in);
        String action;

        System.out.println("当前状态: " + sm.getCurrentState()); // 打印当前状态
        while (true) {
            // 提示用户输入
            System.out.println("输入动作 (支付, 退款, 取消) 或 '退出' 以结束:");
            action = scanner.nextLine();

            if (action.equals("退出")) {
                break; // 退出循环
            }

            // 触发状态转换
            sm.trigger(action);
            System.out.println("当前状态: " + sm.getCurrentState()); // 打印当前状态
        }

        scanner.close(); // 关闭扫描器
    }
}
